package com.example.jsd2205.vx.emos.controller;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import com.example.jsd2205.vx.emos.common.util.R;
import com.example.jsd2205.vx.emos.config.SystemConstants;
import com.example.jsd2205.vx.emos.config.shiro.JwtUtil;
import com.example.jsd2205.vx.emos.controller.form.CheckinForm;
import com.example.jsd2205.vx.emos.controller.form.SearchMonthCheckinForm;
import com.example.jsd2205.vx.emos.exception.EmosException;
import com.example.jsd2205.vx.emos.service.CheckinService;
import com.example.jsd2205.vx.emos.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.validation.Valid;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;

/**
 * 封装检测当天是否可以签到
 * 调试(通过)
 * @author admin苗
 * @author admin闫
 * 签到功能
 */
@RequestMapping("/checkin")
@RestController
@Api("签到模块Web接口")
@Slf4j
public class CheckinController {

    /**
     * 引用工具类
     */
    @Autowired
    private JwtUtil jwtUtil;
    /**
     * 图片本地地址
     */
    @Value("${emos.image-folder}")
    private String imageFolder;

    /**
     * 引用业务层
     */
    @Autowired
    private CheckinService checkinService;
    /**
     * 引用变量
     */
    @Autowired
    private UserService userService;
    /**
     * 引用变量
     */
    @Autowired
    private SystemConstants constants;

    /**
     * 从请求头获取token字符串
     * @param token
     * @return R对象
     */
    @GetMapping("/validCanCheckIn")
    @ApiOperation("查看用户今天是否可以签到")
    public R validCanCheckIn(@RequestHeader("token") String token){
        //通过token反向解析出用户id保存到变量里面
        int userId=jwtUtil.getUserId(token);
        //返回业务消息(现在是否可以签到)
        String result=checkinService.validCanCheckIn(userId, DateUtil.today());
        //业务消息封装到R对象返回给客户端
        return R.ok(result);
    }

    /**
     * 签到功能
     * @param form
     * @param file
     * @param token
     * @return R
     * @author admin 闫
     */
    @PostMapping("/checkin")
    @ApiOperation("签到")
    public R checkin(@Valid CheckinForm form, @RequestParam("photo") MultipartFile file, @RequestHeader("token") String token){
        if(file==null){ //判断是都上传文件
            return R.error("没有上传文件");
        }
        int userId=jwtUtil.getUserId(token);
        String fileName=file.getOriginalFilename().toLowerCase();
        if(!fileName.endsWith(".jpg")){
            return R.error("必须提交JPG格式图片");
        }
        else{
            String path=imageFolder+"/"+fileName;
            try{
                file.transferTo(Paths.get(path));
                HashMap param=new HashMap();
                param.put("userId",userId);
                param.put("path",path);
                param.put("city",form.getCity());
                param.put("district",form.getDistrict());
                param.put("address",form.getAddress());
                param.put("country",form.getCountry());
                param.put("province",form.getProvince());
                checkinService.checkin(param);
                return R.ok("签到成功");
            }catch (IOException e){
                log.error(e.getMessage(),e);
                throw new EmosException("图片保存错误");
            }
            finally {
                FileUtil.del(path);
            }

        }
    }

    /**
     * 创建新员工的人脸模型数据
     * @param file
     * @param token
     * @return R
     */
    @PostMapping("/createFaceModel")
    @ApiOperation("创建人脸模型")
    public R createFaceModel(@RequestParam("photo") MultipartFile file,@RequestHeader("token") String token){
        if(file==null){
            return R.error("没有上传文件");
        }
        int userId=jwtUtil.getUserId(token);
        String fileName=file.getOriginalFilename().toLowerCase();
        if(!fileName.endsWith(".jpg")){
            return R.error("必须提交JPG格式图片");
        }
        else{
            String path=imageFolder+"/"+fileName;
            try{
                file.transferTo(Paths.get(path));
                checkinService.createFaceModel(userId,path);//调用业务层代码
                return R.ok("人脸建模成功");
            }catch (IOException e){
                log.error(e.getMessage(),e);
                throw new EmosException("图片保存错误");
            }
            finally {
                FileUtil.del(path);
            }
        }
    }
    /**
     * 查询用户当日签到数据
     * @param token
     * @return R
     */
    @GetMapping("/searchTodayCheckin")
    @ApiOperation("查询用户当日签到数据")
    public R searchTodayCheckin(@RequestHeader("token") String token){
        int userId=jwtUtil.getUserId(token);
        /*
        获取员工的考勤结果,并放置当天考勤的开始时间与截止时间
         */
        HashMap map=checkinService.searchTodayCheckin(userId);
        map.put("attendanceTime",constants.attendanceTime);
        map.put("closingTime",constants.closingTime);
        long days=checkinService.searchCheckinDays(userId);
        map.put("checkinDays",days);//获取签到总天数
        /*
            判断日期是否在用户入职之前
         */
        DateTime hiredate=DateUtil.parse(userService.searchUserHiredate(userId)); //获取用户入职日期
        DateTime startDate=DateUtil.beginOfWeek(DateUtil.date());//本周开始日期
        if(startDate.isBefore(hiredate)){//判断入职日期是否在本周开始日期之前
            startDate=hiredate;
        }
        DateTime endDate=DateUtil.endOfWeek(DateUtil.date());//本周结束日期
        HashMap param=new HashMap();
        param.put("startDate",startDate.toString());
        param.put("endDate",endDate.toString());
        param.put("userId",userId);
        ArrayList<HashMap> list=checkinService.searchWeekCheckin(param);
        map.put("weekCheckin",list);//添加考勤结果

        return R.ok().put("result",map);
    }
    /**
     * 查询月考勤签到信息
     * @param form
     * @param token
     * @return R
     *
     */
    @PostMapping("/searchMonthCheckin")
    @ApiOperation("查询用户某月签到数据")
    public R searchMonthCheckin(@Valid @RequestBody SearchMonthCheckinForm form, @RequestHeader("token") String token){
        int userId=jwtUtil.getUserId(token);//查询userId
        //查询员工入职日期
        DateTime hiredate=DateUtil.parse(userService.searchUserHiredate(userId));
        String month=form.getMonth()<10?"0"+form.getMonth():form.getMonth().toString();//将月份字符串转为两位
        DateTime startDate=DateUtil.parse(form.getYear()+"-"+month+"-01");
        /*
        判断员工查询的某年某月第一天的日期对象,是否在员工入职日期月份对象之前
         */
        if(startDate.isBefore(DateUtil.beginOfMonth(hiredate))){
            throw new EmosException("只能查询考勤之后日期的数据");
        }
        /*
        查询月份 是否大于等于员工入职日期的月份
         */
        if(startDate.isBefore(hiredate)){
            startDate=hiredate;
        }
        //月份截止日期
        DateTime endDate=DateUtil.endOfMonth(startDate);
        HashMap param=new HashMap();
        param.put("userId",userId);
        param.put("startDate",startDate.toString());
        param.put("endDate",endDate.toString());
        ArrayList<HashMap> list=checkinService.searchMonthCheckin(param);
        int sum_1=0,sum_2=0,sum_3=0;
        /*
        提取本月的考勤记录
         */
        for(HashMap<String,String> one:list){
            String type=one.get("type");
            String status=one.get("status");
            if("工作日".equals(type)){
                if("正常".equals(status)){
                    sum_1++;
                }
                else if("迟到".equals(status)){
                    sum_2++;
                }
                else if("缺勤".equals(status)){
                    sum_3++;
                }
            }
        }
        return R.ok().put("list",list).put("sum_1",sum_1).put("sum_2",sum_2).put("sum_3",sum_3);
    }


}
